﻿#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>


//
//常见的动语态内存管理的错误! 
//这里列举的都是错误代码
//

//1.对于NULL指针的解引用操作
//int main()
//{
//	int* p = (int*)malloc(40);
//	/*if (p == NULL)
//	{
//		return 1;
//	}*/
//	*p = 20;//若为判断 如果p的值为NULL，就会有问题。
//	free(p);
//	p = NULL;
//
//	return 0;
//}


//2.对动态开辟空间的越界访问

//int main()
//{
//	int* p = (int*)malloc(40);
//	if (p == NULL)
//	{
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//	//方式
//	int i = 0;
//	for (i = 0; i <= 10; i++)//error//越界
//	{
//		p[i] = i;
//	}
//	free(p);
//	p = NULL;
//
//	return 0;
//}


//3.对于非动态开辟内存使用free释放

//int main()
//{
//	int a = 10;
//	int* p = &a;
//	//...
//
//	free(p);
//	p = NULL;
//
//	return 0;
//}


//4.使用free释放一块动态开辟内存的一部分

//int main()
//{
//	int* p = (int*)malloc(40);
//	if (p == NULL)
//	{
//		return 1;
//	}
//	//使用
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		//p[i] = i;//*(p + i) = i;
//		*p = i;//error//这里p的地址在变
//		p++;
//	}
//
//	//释放
//	free(p);
//	p = NULL;
//	return 0;
//}


//5.对同一块动态内存多次释放

//int main()
//{
//	int* p = (int*)malloc(40);
//	if (p == NULL)
//	{
//		return 1;
//	}
//	//...
//	free(p);
//	//...
//	free(p);
//
//
//	return 0;
//}

//6.动态开辟内存忘记释放(内存泄漏)
//void test()
//{
//	int* p = (int*)malloc(40);C
//	//...
//
//	int flag = 0;
//	scanf("%d", &flag);//5
//	if (flag == 5)
//		return;//若输出5为真直接跳出未执行free
//
//	free(p);
//	p = NULL;
//
//}
//
//int main()
//{
//	test();
//	//...
//
//
//	return 0;
//}


//int* test()
//{
//	//开辟的
//	int* p = (int*)malloc(40);
//	if (p == NULL)
//	{
//		return p;
//	}
//	//...
//	return p;
//}
//
//int main()
//{
//	int* ret = test();//调用开辟内存函数
//	//忘记free了
//
//	return 0;
//}


//动态管理 内存泄漏 笔试题
// 代码错误为什么？


//void GetMemory(char* p)
//{
//	p = (char*)malloc(100);//内存泄漏
//}
//
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(str);
//	strcpy(str, "hello world");
//	printf(str);//str是NULL，解引用时会崩溃
//}
//int main()
//{
//	Test();
//	return 0;
//}

//对上一题的正确改变
// 
//void GetMemory(char** p)
//{
//	*p = (char*)malloc(100);//内存泄漏
//}
//
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(&str);
//	//str存放的就是动态开辟的100字节的地址
//	strcpy(str, "hello world");
//	printf(str);//str是NULL，解引用时会崩溃
//	//释放
//	free(str)
//	str = NULL;
//}
//int main()
//{
//	Test();
//	return 0;
//}

